package com.servitware.cardio.domain;


import java.io.Serializable;
import java.util.Date;

import com.servitware.cardio.domain.transport.ClienteTx;
import com.servitware.core.id.base.InvalidIdException;
import com.servitware.core.id.base.InvalidNameException;
import com.servitware.crm.Contacto;
import com.servitware.crm.Nif;
import com.servitware.crm.Sexo;
import com.servitware.crm.cliente.Cliente;
import com.servitware.crm.cliente.ClientePersona;

/**
 * Este es el Cliente final, el que se hace la prueba y recibe el Informe.
 * 
 * @author erik
 *
 */
public class ClienteIndirecto extends ClientePersona implements Cliente, Serializable
{
	private static final long serialVersionUID = 3851504747623032024L;
	
	
	private String antecedentes = null;
	private Integer estatura = null;
	private Integer peso = null;
	
	private Centro centro = null;
	private Integer clienteDirecto = null;
	private ClienteDirectoUsuario usuario = null;
	
	private boolean enviarResultadoPorCorreoPostal = false;
	private Date fechaRegistro = null;
	
	private String emailMedicoAlQueEnviarInforme = null;
	private Boolean clienteGestionadoPorMedico = null;

	private Integer solicitudes = null;
	private Integer pruebas = null;
	private Integer informes = null;
	
	public ClienteIndirecto()
	{
		super();
	}

	
	public ClienteIndirecto(Integer id, String name, String pApellido, String sApellido, Nif nif) throws InvalidIdException, InvalidNameException
	{
		super(id, name,  pApellido, sApellido, nif );
	}
	
	public ClienteIndirecto(ClienteTx c) throws InvalidIdException, InvalidNameException
	{
		
		setName( c.getNombre() );
		setPrimerApellido( c.getPrimerApellido() );
		setSegundoApellido( c.getSegundoApellido() );
		
		try
		{
			setNif( new Nif( c.getNif() ) );
		}
		catch (Exception e)
		{
		}
		
		try
		{
			setId( c.getId() );
		}
		catch (Exception e)
		{
		}
			
		
		setSexo( new Sexo( c.getSexo() ) );
		setAntecedentes(c.getAntecedentes());
		setCuentaBancaria(c.getCuentaBancaria() );
		setEmailMedicoAlQueEnviarInforme( c.getEmailMedicoAlQueEnviarInforme() );
		setEnviarResultadoPorCorreoPostal(c.isEnviarResultadoViaPostal() );
		
		/*
		 * cliente final que lo registra
		 */
		setClienteDirecto( c.getClienteDirecto() );
		
		/*
		 * si tiene centro
		 */
		if( c.getCentro() != null )
		{
			Centro centro = new Centro();
			centro.setId( c.getCentro() );
			setCentro(centro);
		}
		
		
		/*
		 * datos de conttacto
		 * ---
		 * son obligatorios, porque el nombre usuario es su email
		 */
		Contacto contacto = new Contacto();
		contacto.setEmail(c.getEmail() );
		contacto.setTelefonoFijo(c.getTelefono());
		contacto.setTelefonoMovil(c.getMovil());
		
		setContacto(contacto);
		
	}
	
	
	
	/*
	 * ------------------------------------------------- 
	 * NO TOCAR -- No es generado
	 * -------------------------------------------------
	 */

	/**
	 * Genera objeto de transporte para webs service RESTful/JSON
	 * 
	 * @return version SexionTx de Sesion
	 */
	public ClienteTx getClienteTx()
	{
		ClienteTx ctx = new ClienteTx(getId(), getName());
		
		ctx.setEnviarResultadoViaPostal( isEnviarResultadoPorCorreoPostal() );
		ctx.setAntecedentes( antecedentes );
		ctx.setEstatura( estatura);
		ctx.setPeso( peso );

		return ctx;
	}


	@Override
	public int hashCode()
	{
		final int prime = 31;
		int result = super.hashCode();
		result = prime * result + ((centro == null) ? 0 : centro.hashCode());
		result = prime * result + ((estatura == null) ? 0 : estatura.hashCode());
		result = prime * result + ((fechaRegistro == null) ? 0 : fechaRegistro.hashCode());
		result = prime * result + ((peso == null) ? 0 : peso.hashCode());
		result = prime * result + ((usuario == null) ? 0 : usuario.hashCode());
		return result;
	}

	@Override
	public boolean equals(Object obj)
	{
		if (this == obj)
			return true;
		if (!super.equals(obj))
			return false;
		if (getClass() != obj.getClass())
			return false;
		ClienteIndirecto other = (ClienteIndirecto) obj;
		if (centro == null)
		{
			if (other.centro != null)
				return false;
		}
		else if (!centro.equals(other.centro))
			return false;
		if (estatura == null)
		{
			if (other.estatura != null)
				return false;
		}
		else if (!estatura.equals(other.estatura))
			return false;
		if (fechaRegistro == null)
		{
			if (other.fechaRegistro != null)
				return false;
		}
		else if (!fechaRegistro.equals(other.fechaRegistro))
			return false;
		if (peso == null)
		{
			if (other.peso != null)
				return false;
		}
		else if (!peso.equals(other.peso))
			return false;
		if (usuario == null)
		{
			if (other.usuario != null)
				return false;
		}
		else if (!usuario.equals(other.usuario))
			return false;
		return true;
	}
	
/*
 * 
 * -----------------------------------------------------------------------------------
 * getters & setters
 * -----------------------------------------------------------------------------------
 */

	public boolean isEnviarResultadoPorCorreoPostal()
	{
		return enviarResultadoPorCorreoPostal;
	}

	public void setEnviarResultadoPorCorreoPostal(boolean enviarResultadoPorCorreoPostal)
	{
		this.enviarResultadoPorCorreoPostal = enviarResultadoPorCorreoPostal;
	}

	public String getEmailMedicoAlQueEnviarInforme()
	{
		return emailMedicoAlQueEnviarInforme;
	}

	public void setEmailMedicoAlQueEnviarInforme(String emailMedicoAlQueEnviarInforme)
	{
		this.emailMedicoAlQueEnviarInforme = emailMedicoAlQueEnviarInforme;
	}

	public Date getFechaRegistro()
	{
		return fechaRegistro;
	}

	public void setFechaRegistro(Date fechaRegistro)
	{
		this.fechaRegistro = fechaRegistro;
	}

	public Centro getCentro()
	{
		return centro;
	}

	public void setCentro(Centro centro)
	{
		this.centro = centro;
	}

	public ClienteDirectoUsuario getUsuario()
	{
		return usuario;
	}

	public void setUsuario(ClienteDirectoUsuario usuario)
	{
		this.usuario = usuario;
	}

	public String getAntecedentes()
	{
		return antecedentes;
	}

	public void setAntecedentes(String antecedentes)
	{
		this.antecedentes = antecedentes;
	}

	public Integer getEstatura()
	{
		return estatura;
	}

	public void setEstatura(Integer estatura)
	{
		this.estatura = estatura;
	}

	public Integer getPeso()
	{
		return peso;
	}

	public void setPeso(Integer peso)
	{
		this.peso = peso;
	}


	public Boolean getClienteGestionadoPorMedico()
	{
		return clienteGestionadoPorMedico;
	}


	public void setClienteGestionadoPorMedico(Boolean clienteGestionadoPorMedico)
	{
		this.clienteGestionadoPorMedico = clienteGestionadoPorMedico;
	}


	public Integer getClienteDirecto()
	{
		return clienteDirecto;
	}


	public void setClienteDirecto(Integer clienteDirecto)
	{
		this.clienteDirecto = clienteDirecto;
	}


	public Integer getSolicitudes()
	{
		return solicitudes;
	}


	public void setSolicitudes(Integer solicitudes)
	{
		this.solicitudes = solicitudes;
	}


	public Integer getPruebas()
	{
		return pruebas;
	}


	public void setPruebas(Integer pruebas)
	{
		this.pruebas = pruebas;
	}


	public Integer getInformes()
	{
		return informes;
	}


	public void setInformes(Integer informes)
	{
		this.informes = informes;
	}



	
}
